home *** CD-ROM | disk | FTP | other *** search
/ PLAYymate for OS/2 / Playmate for OS2.iso / p4os2008 / checkers.c next >
C/C++ Source or Header  |  1990-09-01  |  15KB  |  392 lines

  1. /*------------------------------------------------------------------------
  2.    CHECKERS.C -- OS/2 Presentation Manager Checkers Program, Version 0.40
  3.                  (c) 1990, Charles Petzold
  4.                  Microsoft Systems Journal, September 1990
  5.   ------------------------------------------------------------------------*/
  6.  
  7. #define INCL_WIN
  8. #include <os2.h>
  9. #include <stdio.h>
  10. #include "checkers.h"
  11.  
  12. MRESULT EXPENTRY ClientWndProc  (HWND, USHORT, MPARAM, MPARAM) ;
  13. MRESULT EXPENTRY JudgeWndProc   (HWND, USHORT, MPARAM, MPARAM) ;
  14. MRESULT EXPENTRY BoardWndProc   (HWND, USHORT, MPARAM, MPARAM) ;
  15. MRESULT EXPENTRY StratWndProc   (HWND, USHORT, MPARAM, MPARAM) ;
  16. MRESULT EXPENTRY NewGameDlgProc (HWND, USHORT, MPARAM, MPARAM) ;
  17. MRESULT EXPENTRY AboutDlgProc   (HWND, USHORT, MPARAM, MPARAM) ;
  18. MRESULT EXPENTRY SetupDlgProc   (HWND, USHORT, MPARAM, MPARAM) ;
  19. MRESULT EXPENTRY SetupCntlProc  (HWND, USHORT, MPARAM, MPARAM) ;
  20.  
  21. HAB hab ;
  22.  
  23. int main (void)
  24.      {
  25.      static CHAR  szClientClass[] = "Checkers" ;
  26.      static ULONG flFrameFlags = FCF_TITLEBAR      | FCF_SYSMENU  |
  27.                                  FCF_SIZEBORDER    | FCF_MINMAX   |
  28.                                  FCF_SHELLPOSITION | FCF_TASKLIST |
  29.                                  FCF_MENU ;
  30.      HMQ          hmq ;
  31.      HWND         hwndFrame, hwndClient ;
  32.      QMSG         qmsg ;
  33.  
  34.      hab = WinInitialize (0) ;
  35.      hmq = WinCreateMsgQueue (hab, 0) ;
  36.      WinRegisterClass (hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0) ;
  37.  
  38.      hwndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE,
  39.                                      &flFrameFlags, szClientClass, NULL,
  40.                                      0L, 0, ID_RESOURCE, &hwndClient) ;
  41.  
  42.      while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
  43.           WinDispatchMsg (hab, &qmsg) ;
  44.  
  45.      WinDestroyWindow (hwndFrame) ;
  46.      WinDestroyMsgQueue (hmq) ;
  47.      WinTerminate (hab) ;
  48.      return 0 ;
  49.      }
  50.  
  51. MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  52.      {
  53.      static CHAR    szJudgeClass   [] = "Checkers.Judge",
  54.                     szStratClass   [] = "Checkers.Strat",
  55.                     szBoardClass   [] = "Checkers.Board",
  56.                     szSetupClass   [] = "Checkers.Setup",
  57.                     *apchColor    [2] = { "Black", "White" },
  58.                     *apchCongrats [3] = { "Congratulations!", "Sorry!", ""},
  59.                     szBuffer     [80] ;
  60.      static GAMEDLG gamedlg ;
  61.      static HWND    hwndJudge, hwndStrat, hwndBoard, hwndMenu ;
  62.      static NEWGAME newgame ;
  63.      SHORT          sWinColor, sCongrats ;
  64.  
  65.      switch (msg)
  66.           {
  67.           case WM_CREATE:
  68.                                    // Register Judge class & create window
  69.  
  70.                WinRegisterClass (hab, szJudgeClass, JudgeWndProc,
  71.                                  CS_SIZEREDRAW, 0) ;
  72.  
  73.                hwndJudge = WinCreateWindow (HWND_OBJECT, szJudgeClass, NULL,
  74.                                             0L, 0, 0, 0, 0,
  75.                                             hwnd, HWND_BOTTOM, 1, NULL, NULL) ;
  76.  
  77.                                    // Register Strat class & create window
  78.  
  79.                WinRegisterClass (hab, szStratClass, StratWndProc,
  80.                                  CS_SIZEREDRAW, 0) ;
  81.  
  82.                hwndStrat = WinCreateWindow (HWND_OBJECT, szStratClass, NULL,
  83.                                             0L, 0, 0, 0, 0,
  84.                                             hwnd, HWND_BOTTOM, 1, NULL, NULL) ;
  85.  
  86.                                    // Register Board class & create window
  87.  
  88.                WinRegisterClass (hab, szBoardClass, BoardWndProc,
  89.                                  CS_SIZEREDRAW, 0) ;
  90.  
  91.                hwndBoard = WinCreateWindow (hwnd, szBoardClass, NULL,
  92.                                             WS_VISIBLE, 0, 0, 0, 0,
  93.                                             hwnd, HWND_BOTTOM, 2, NULL, NULL) ;
  94.  
  95.                                    // Register Setup class
  96.  
  97.                WinRegisterClass (hab, szSetupClass, SetupCntlProc,
  98.                                  CS_SIZEREDRAW, sizeof (PSETUPDLG)) ;
  99.  
  100.                                    // Begin a new game
  101.  
  102.                gamedlg.sColor      = IDD_BLACK ;
  103.                gamedlg.sLevel      = IDD_INTERMEDIATE ;
  104.  
  105.                newgame.brd.ulBlack = 0x00000FFF ;
  106.                newgame.brd.ulWhite = 0xFFF00000 ;
  107.                newgame.brd.ulKing  = 0x00000000 ;
  108.  
  109.                newgame.hwndBlack   = hwndBoard ;
  110.                newgame.hwndWhite   = hwndStrat ;
  111.                newgame.hwndBoard   = hwndBoard ;
  112.                newgame.hwndJudge   = hwndJudge ;
  113.                newgame.hwndClient  = hwnd ;
  114.                newgame.sBottom     = BLACK ;
  115.                newgame.sLevel      = LEVEL_INTERMEDIATE ;
  116.  
  117.                WinSendMsg (hwndJudge, WM_NEW_GAME,
  118.                            &newgame, NULL) ;
  119.  
  120.                                    // Obtain handle of menu window
  121.  
  122.                hwndMenu = WinWindowFromID (
  123.                               WinQueryWindow (hwnd, QW_PARENT, FALSE),
  124.                               FID_MENU) ;
  125.                return 0 ;
  126.  
  127.           case WM_TELL_CLIENT_GAME_OVER:
  128.                sWinColor = SHORT1FROMMP (mp1) ;
  129.  
  130.                if (newgame.hwndBlack == hwndBoard)
  131.                     {
  132.                     if (sWinColor == BLACK)
  133.                          sCongrats = 0 ;
  134.                     else
  135.                          sCongrats = 1 ;
  136.                     }
  137.                else if (newgame.hwndWhite == hwndBoard)
  138.                     {
  139.                     if (sWinColor == WHITE)
  140.                          sCongrats = 0 ;
  141.                     else
  142.                          sCongrats = 1 ;
  143.                     }
  144.                else
  145.                     sCongrats = 2 ;
  146.  
  147.                sprintf (szBuffer, "Game over!  %s wins.  %s",
  148.                         apchColor [sWinColor], apchCongrats [sCongrats]) ;
  149.  
  150.                WinMessageBox (HWND_DESKTOP, hwnd, szBuffer, "CHECKERS", 0,
  151.                               MB_ICONEXCLAMATION | MB_OK) ;
  152.  
  153.                WinSendMsg (hwnd, WM_COMMAND, MPFROMSHORT (IDM_NEWGAME), NULL) ;
  154.  
  155.                return 0 ;
  156.  
  157.           case WM_SIZE:
  158.                                    // Resize Board window
  159.  
  160.                WinSetWindowPos (hwndBoard, NULL, 0, 0,
  161.                                 SHORT1FROMMP (mp2), SHORT2FROMMP (mp2),
  162.                                 SWP_MOVE | SWP_SIZE) ;
  163.                return 0 ;
  164.  
  165.           case WM_CHAR:
  166.                                    // Send keystrokes to Board window
  167.  
  168.                return WinSendMsg (hwndBoard, WM_CHAR, mp1, mp2) ;
  169.  
  170.           case WM_COMMAND:
  171.                                    // Process menu commands
  172.  
  173.                switch (COMMANDMSG (&msg)->cmd)
  174.                     {
  175.                     case IDM_NEWGAME:
  176.  
  177.                          gamedlg.brd.ulBlack = 0 ;
  178.                          gamedlg.brd.ulWhite = 0 ;
  179.                          gamedlg.brd.ulKing  = 0 ;
  180.  
  181.                          if (WinDlgBox (HWND_DESKTOP, hwnd, NewGameDlgProc,
  182.                                         0, IDD_NEWGAME_DLG, &gamedlg))
  183.                               {
  184.                               newgame.brd = gamedlg.brd ;
  185.  
  186.                               if (newgame.brd.ulBlack == 0 &&
  187.                                   newgame.brd.ulWhite == 0)
  188.                                    {
  189.                                    newgame.brd.ulBlack = 0x00000FFF ;
  190.                                    newgame.brd.ulWhite = 0xFFF00000 ;
  191.                                    newgame.brd.ulKing  = 0x00000000 ;
  192.                                    }
  193.  
  194.                               switch (gamedlg.sColor)
  195.                                    {
  196.                                    case IDD_BLACK:
  197.                                         newgame.hwndBlack = hwndBoard ;
  198.                                         newgame.hwndWhite = hwndStrat ;
  199.                                         newgame.sBottom   = BLACK ;
  200.                                         break ;
  201.  
  202.                                    case IDD_WHITE:
  203.                                         newgame.hwndBlack = hwndStrat ;
  204.                                         newgame.hwndWhite = hwndBoard ;
  205.                                         newgame.sBottom   = WHITE ;
  206.                                         break ;
  207.                                    }
  208.  
  209.                               newgame.sLevel = LEVEL_SIMPLE + gamedlg.sLevel -
  210.                                                IDD_SIMPLE ;
  211.  
  212.                               WinSendMsg (hwndJudge, WM_NEW_GAME,
  213.                                           &newgame, NULL) ;
  214.                               }
  215.  
  216.                          return 0 ;
  217.  
  218.                     case IDM_ABOUT:
  219.                          WinDlgBox (HWND_DESKTOP, hwnd, AboutDlgProc,
  220.                                     0, IDD_ABOUT_DLG, NULL) ;
  221.                          return 0 ;
  222.  
  223.                     case IDM_COLOR_BACKGROUND:
  224.                     case IDM_COLOR_BLACK_SQUARE:
  225.                     case IDM_COLOR_WHITE_SQUARE:
  226.                          WinSendMsg (hwndBoard, WM_TELL_BOARD_COLOR_DIALOG,
  227.                                      MPFROMP (&COMMANDMSG (&msg)->cmd),
  228.                                      MPFROMSHORT (FALSE)) ;
  229.                          return 0 ;
  230.  
  231.                     case IDM_COLOR_BLACK_PIECE:
  232.                     case IDM_COLOR_WHITE_PIECE:
  233.                          WinSendMsg (hwndBoard, WM_TELL_BOARD_COLOR_DIALOG,
  234.                                      MPFROMP (&COMMANDMSG (&msg)->cmd),
  235.                                      MPFROMSHORT (TRUE)) ;
  236.                          return 0 ;
  237.  
  238.                     case IDM_COLOR_STANDARD:
  239.                          WinSendMsg (hwndBoard, WM_TELL_BOARD_STANDARD_COLORS,
  240.                                      NULL, NULL) ;
  241.                          return 0 ;
  242.                     }
  243.                break ;
  244.  
  245.           case WM_TELL_CLIENT_NO_MEMORY:
  246.                WinMessageBox (HWND_DESKTOP, hwnd,
  247.                               "Cannot allocate enough memory for analyzing "
  248.                               "best move.  The program will be terminated.",
  249.                               "CHECKERS", 0, MB_OK | MB_CRITICAL) ;
  250.  
  251.                WinPostMsg (hwnd, WM_QUIT, NULL, NULL) ;
  252.                return 0 ;
  253.           }
  254.  
  255.      return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
  256.      }
  257.  
  258. MRESULT EXPENTRY NewGameDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  259.      {
  260.      static GAMEDLG  gamedlgLocal ;
  261.      static PGAMEDLG pgamedlg ;
  262.      static SETUPDLG setupdlg ;
  263.  
  264.      switch (msg)
  265.           {
  266.           case WM_INITDLG:
  267.                pgamedlg = PVOIDFROMMP (mp2) ;
  268.  
  269.                gamedlgLocal = *pgamedlg ;
  270.  
  271.                WinSendDlgItemMsg (hwnd, gamedlgLocal.sColor, BM_SETCHECK,
  272.                                   MPFROM2SHORT (TRUE, 0), NULL) ;
  273.  
  274.                WinSendDlgItemMsg (hwnd, gamedlgLocal.sLevel, BM_SETCHECK,
  275.                                   MPFROM2SHORT (TRUE, 0), NULL) ;
  276.  
  277.                WinSetFocus (HWND_DESKTOP,
  278.                             WinWindowFromID (hwnd, gamedlgLocal.sColor)) ;
  279.  
  280.                return MRFROMSHORT (1) ;
  281.  
  282.           case WM_CONTROL:
  283.                switch (SHORT1FROMMP (mp1))
  284.                     {
  285.                     case IDD_BLACK:
  286.                     case IDD_WHITE:
  287.                          gamedlgLocal.sColor = SHORT1FROMMP (mp1) ;
  288.                          return 0 ;
  289.  
  290.                     case IDD_SIMPLE:
  291.                     case IDD_BEGINNER:
  292.                     case IDD_INTERMEDIATE:
  293.                     case IDD_ADVANCED:
  294.                          gamedlgLocal.sLevel = SHORT1FROMMP (mp1) ;
  295.                          return 0 ;
  296.                     }
  297.                break ;
  298.  
  299.           case WM_COMMAND:
  300.                switch (COMMANDMSG(&msg)->cmd)
  301.                     {
  302.                     case DID_OK:
  303.                          pgamedlg->brd    = gamedlgLocal.brd ;
  304.                          pgamedlg->sColor = gamedlgLocal.sColor ;
  305.                          pgamedlg->sLevel = gamedlgLocal.sLevel ;
  306.  
  307.                          WinDismissDlg (hwnd, TRUE) ;
  308.                          return 0 ;
  309.  
  310.                     case DID_CANCEL:
  311.                          WinDismissDlg (hwnd, FALSE) ;
  312.                          return 0 ;
  313.  
  314.                     case IDD_SETUP:
  315.                          setupdlg.brd = gamedlgLocal.brd ;
  316.  
  317.                          if (gamedlgLocal.sColor == IDD_BLACK)
  318.                               setupdlg.sBottom = BLACK ;
  319.                          else
  320.                               setupdlg.sBottom = WHITE ;
  321.  
  322.                          if (WinDlgBox (HWND_DESKTOP, hwnd, SetupDlgProc,
  323.                                         0, IDD_SETUP_DLG, &setupdlg))
  324.                               {
  325.                               gamedlgLocal.brd = setupdlg.brd ;
  326.                               }
  327.                          return 0 ;
  328.                     }
  329.                break ;
  330.           }
  331.      return WinDefDlgProc (hwnd, msg, mp1, mp2) ;
  332.      }
  333.  
  334. MRESULT EXPENTRY SetupDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  335.      {
  336.      static CHAR      *pachColor[] = { "[Black]", "[White]" } ;
  337.      static HWND      hwndSetupCntl ;
  338.      static PSETUPDLG psetupdlg ;
  339.      static SETUPDLG  setupdlgLocal ;
  340.  
  341.      switch (msg)
  342.           {
  343.           case WM_INITDLG:
  344.                hwndSetupCntl = WinWindowFromID (hwnd, IDD_SETUP) ;
  345.                psetupdlg     = PVOIDFROMMP (mp2) ;
  346.                setupdlgLocal = *psetupdlg ;
  347.  
  348.                WinSetWindowPtr (hwndSetupCntl, 0, &setupdlgLocal) ;
  349.  
  350.                WinSetDlgItemText (hwnd, IDD_TOP,
  351.                          pachColor [psetupdlg->sBottom == BLACK ? 1 : 0]) ;
  352.  
  353.                WinSetDlgItemText (hwnd, IDD_BOTTOM,
  354.                          pachColor [psetupdlg->sBottom == BLACK ? 0 : 1]) ;
  355.  
  356.                return 0 ;
  357.  
  358.           case WM_COMMAND:
  359.                switch (COMMANDMSG(&msg)->cmd)
  360.                     {
  361.                     case DID_OK:
  362.                          psetupdlg->brd = setupdlgLocal.brd ;
  363.  
  364.                          WinDismissDlg (hwnd, TRUE) ;
  365.                          return 0 ;
  366.  
  367.                     case DID_CANCEL:
  368.                          WinDismissDlg (hwnd, FALSE) ;
  369.                          return 0 ;
  370.                     }
  371.                break ;
  372.           }
  373.      return WinDefDlgProc (hwnd, msg, mp1, mp2) ;
  374.      }
  375.  
  376. MRESULT EXPENTRY AboutDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  377.      {
  378.      switch (msg)
  379.           {
  380.           case WM_COMMAND:
  381.                switch (COMMANDMSG(&msg)->cmd)
  382.                     {
  383.                     case DID_OK:
  384.                     case DID_CANCEL:
  385.                          WinDismissDlg (hwnd, TRUE) ;
  386.                          return 0 ;
  387.                     }
  388.                break ;
  389.           }
  390.      return WinDefDlgProc (hwnd, msg, mp1, mp2) ;
  391.      }
  392.